// 热点管理类
#ifndef __MY_HOT__
#define __MY_HOT__
#include "util.hpp"
#include "data.hpp"
#include "config.hpp"
#include <unistd.h>
extern cloud::DataManager *_data;
namespace cloud
{
    // 将数据管理对象的指针传递进来
    class HotManager
    {
    private:
        std::string _back_dir;    // 备份文件路径/目录
        std::string _pack_dir;    // 压缩文件路径
        int _hot_time;            // 热点判断时间
        std::string _pack_suffix; // 压缩包后缀名
    private:
        // 热点判断接口，非热点文件返回真，热点文件返回假
        bool HotJudge(const std::string &filename)
        {
            cloud::FileUtil fu(filename);
            // 获取文件最后一次访问时间
            time_t last_atime = fu.LastATime();
            // 获取当前系统时间
            time_t cur_time = time(NULL);
            // 判断如果当前时间-最后一次访问时间大于热点时间
            if (cur_time - last_atime > _hot_time)
            {
                return true;
            }
            return false;
        }

    public:
        HotManager()
        {
            // 构造函数获取操作句柄
            cloud::Config *config = cloud::Config::GetInstance();
            _back_dir = config->GetBackDir();
            _pack_dir = config->GetPackDir();
            _pack_suffix = config->GetPackfileSuffix();
            _hot_time = config->GetHotTime();
            // 如果不存在存储路径和压缩路径就创建他
            cloud::FileUtil tmp1(_back_dir);
            tmp1.CreateDirectory();
            cloud::FileUtil tmp2(_pack_dir);
            tmp2.CreateDirectory();
        }
        // 运行模块函数
        bool RunModule()
        {
            // 整体的模块并不是一次就运行完的，所以要死循环
            while (1)
            {
                // 1、遍历备份目录，获取所有文件名
                // 先实例化文件操作工具
                cloud::FileUtil fu(_back_dir);
                // 调用函数浏览目录，放在数组中
                std::vector<std::string> array;
                fu.ScanDirectory(&array);
                // 2、遍历判断文件是否是非热点文件
                for (auto &a : array)
                {
                    if (HotJudge(a) == false)
                    {
                        // 是热点文件并不需要进行处理
                        continue;
                    }
                    // 如果是非热点文件就要进行压缩
                    cloud::FileUtil tmp(a);
                    // 数据管理结构体
                    cloud::BackupInfo info;
                    // 然后使用全局数据管理获取数据
                    if (_data->GetOneByRealPath(a, &info) == false)
                    {
                        // 此时说明文件存在，但是没有备份信息，漏记录了
                        // 设置新的备份信息
                        info.NewBackupInfo(a);
                    }
                    // 对非热点文件进行压缩,此时pack_path就是压缩包路径名称
                    tmp.Compress(info.pack_path);
                    // 删除源文件，修改备份信息
                    tmp.Remove();
                    info.pack_flag = true;
                    _data->Update(info);
                }
                // 避免空目录循环遍历，消耗cpu资源过高
                usleep(1000); // 1000微秒也就是1ms,unistd.h头文件
            }
            return true;
        }
    };
}
#endif
